package com.ikas.ai;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author admin
 */
@SuppressWarnings("all")
@Component
public class AppContextHelper implements ApplicationContextAware {
    
    /**
     * spring容器上下文
     */
    private static ApplicationContext appContext;

    /**
     * 获取上下文
     *
     * @return
     */
    public static ApplicationContext getContext() {
        return appContext;
    }

    /**
     * 此方法可以把ApplicationContext对象inject到当前类中作为一个静态成员变量。
     *
     * @param applicationContext ApplicationContext 对象.
     * @throws BeansException
     */
    @Override
    public synchronized void setApplicationContext(ApplicationContext applicationContext) {
        appContext = applicationContext;
    }

    public static String getProperty(String key) {
        return appContext.getEnvironment().getProperty(key);
    }

    /**
     * 这是一个便利的方法，帮助我们快速得到一个BEAN
     *
     * @param beanName bean的名字
     * @return 返回一个bean对象
     */
    public static Object getBean(String beanName) {
        return appContext.getBean(beanName);
    }

    /**
     * @param className 类我
     * @return object
     * @Title: getBean
     * @Description: 这是一个便利的方法，帮助我们快速得到一个BEAN
     */

    public static Object getBean(Class<?> className) {
        return appContext.getBean(className);
    }

    /**
     * 获取 bean 的类型
     *
     * @param clazz
     * @return
     */
    public static <T> List<T> getBeansOfType(Class<T> clazz) {
        //声明一个结果
        Map<String, T> map;
        try {
            //获取类型
            map = appContext.getBeansOfType(clazz);
        } catch (Exception e) {
            map = null;
        }
        //返回 bean 的类型
        return map == null ? null : new ArrayList<>(map.values());
    }

    /**
     * 获取所有被注解的 bean
     *
     * @param anno
     * @return
     */
    public static Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> anno) {
        Map<String, Object> map;
        try {
            //获取注解的 bean
            map = appContext.getBeansWithAnnotation(anno);
        } catch (Exception e) {
            map = null;
        }
        return map;
    }
}
